﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ZHello.Utils
{
	internal static class HashUtil
	{
		public static byte CharAt(this string str, int index)
		{
			char c = '\0';
			try
			{
				if (index < str.ToCharArray().Length)
				{
					c = str.ToCharArray()[index];
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return Encoding.ASCII.GetBytes(c.ToString())[0];
		}

		public static long RSHash(string str)
		{
			int num = 378551;
			int num2 = 63689;
			long num3 = 0L;
			for (int i = 0; i < str.Length; i++)
			{
				num3 = num3 * num2 + str.CharAt(i);
				num2 *= num;
			}
			return num3;
		}

		public static long JSHash(string str)
		{
			long num = 1315423911L;
			for (int i = 0; i < str.Length; i++)
			{
				num ^= (num << 5) + str.CharAt(i) + (num >> 2);
			}
			return num;
		}

		public static long PJWHash(string str)
		{
			int num = 32;
			int num2 = (int)Math.Ceiling((decimal)(num * 3 / 4)) + 1;
			int num3 = (int)Math.Ceiling((decimal)(num / 8)) + 1;
			uint num4 = (uint)(-1 << num - num3);
			long num5 = 0L;
			long num6 = 0L;
			for (int i = 0; i < str.Length; i++)
			{
				num5 = (num5 << num3) + str.CharAt(i);
				if ((num6 = num5 & num4) != 0)
				{
					num5 = (num5 ^ (num6 >> num2)) & ~num4;
				}
			}
			return num5;
		}

		public static long ELFHash(string str)
		{
			long num = 0L;
			long num2 = 0L;
			for (int i = 0; i < str.Length; i++)
			{
				num = (num << 4) + str.CharAt(i);
				if ((num2 = num & 0xF0000000u) != 0)
				{
					num ^= num2 >> 24;
				}
				num &= ~num2;
			}
			return num;
		}

		public static long BKDRHash(string str)
		{
			long num = 131L;
			long num2 = 0L;
			for (int i = 0; i < str.Length; i++)
			{
				num2 = num2 * num + str.CharAt(i);
			}
			return num2;
		}

		public static long SDBMHash(string str)
		{
			long num = 0L;
			for (int i = 0; i < str.Length; i++)
			{
				num = str.CharAt(i) + (num << 6) + (num << 16) - num;
			}
			return num;
		}

		public static long DJBHash(string str)
		{
			long num = 5381L;
			for (int i = 0; i < str.Length; i++)
			{
				num = (num << 5) + num + str.CharAt(i);
			}
			return num;
		}

		public static long DEKHash(string str)
		{
			long num = str.Length;
			for (int i = 0; i < str.Length; i++)
			{
				num = (num << 5) ^ (num >> 27) ^ str.CharAt(i);
			}
			return num;
		}

		public static long BPHash(string str)
		{
			long num = 0L;
			for (int i = 0; i < str.Length; i++)
			{
				num = (num << 7) ^ str.CharAt(i);
			}
			return num;
		}

		public static long FNVHash(string str)
		{
			long num = 2166136261L;
			long num2 = 0L;
			for (int i = 0; i < str.Length; i++)
			{
				num2 *= num;
				num2 ^= str.CharAt(i);
			}
			return num2;
		}

		public static long APHash(string str)
		{
			long num = 2863311530L;
			for (int i = 0; i < str.Length; i++)
			{
				num = ((((uint)i & (true ? 1u : 0u)) != 0) ? (num ^ ~((num << 11) ^ str.CharAt(i) ^ (num >> 5))) : (num ^ ((num << 7) ^ str.CharAt(i) ^ (num >> 3))));
			}
			return num;
		}
	}
}
